home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
9-Digit Zip Code Directory
/
9-Digit Zip Code Directory (American Business Information) (ABIZIP-12).ISO
/
z4src.zip
/
Z4POF.C
< prev
next >
Wrap
C/C++ Source or Header
|
1995-07-29
|
9KB
|
311 lines
//----------------------------------------------------------------------------
// MODULE DESCRIPTION
//
// Module: z4pof.c
// Title: ZIP+4 Engine
// Notice: John M. Weeder
// Copyright (c) 1993. All rights reserved.
// This module contains proprietary information and should be
// treated as confidential.
//
//----------------------------------------------------------------------------
// MAINTENANCE HISTORY
//
// $Workfile$
// $Revision$
// $Author$
// $Date$
// $Log$
//
//----------------------------------------------------------------------------
// MODULE NARRATIVE
//
//
// This module contains code to maintain a list of POFs which are being
// excluded from the current build.
//
// The code in this module should be written entirely in C.
// Do not use any C++ constructs.
//
// This module is portable to:
// DOS 3.X+
// MS Windows 3.X+
// OS/2 2.X+
// OS/2 2.0 PM
// SCO UNIX.
//
// The following compilers are supported:
// MSC 6.0A
// MSC/C++ 7.0
// Borland C++ 3.1 for DOS
// Borland C++ 1.0 for OS/2 2.X
// SCO UNIX cc
//
//----------------------------------------------------------------------------
#include <z4.h>
//----------------------------------------------------------------------------
// Description: Sort routine used by qsort to sort an array of pointers
// to strings.
// Parameters: see qsort()
// Returns: see qsort()
//----------------------------------------------------------------------------
static int __pofsort__(const void *pv1, const void *pv2)
{
return memcmp(pv1, pv2, MAX_FINANCE_BCD);
}
//----------------------------------------------------------------------------
// Description:
// Parameters:
// Returns: TRUE if successful.
//----------------------------------------------------------------------------
BOOL FN_E Z4PofAdd(PZ4_PF_TBL ppof, PCSZ pcszFinance)
{
LONG lEntry = Z4PofFind(ppof, pcszFinance);
Assert(ppof);
if (lEntry < 0)
{
BYTE bPof[MAX_FINANCE_BCD];
if (ppof->lSize >= ppof->lMax)
{
Error("POF table overflow.");
return FALSE;
} // Add to table
stra2b(bPof, MAX_FINANCE_BCD, pcszFinance, MAX_FINANCE);
memcpy(ppof->abPof[(SIZET)ppof->lSize], bPof, MAX_FINANCE_BCD);
ppof->lSize++; // Sort
qsort(ppof->abPof, (SIZET)ppof->lSize, MAX_FINANCE_BCD, __pofsort__);
}
return TRUE;
}
//----------------------------------------------------------------------------
// Description:
// Parameters:
// Returns: TRUE if successful.
//----------------------------------------------------------------------------
VOID FN_E Z4PofClear(PZ4_PF_TBL ppof)
{
Assert(ppof);
ppof->lSize = 0;
return ;
}
//----------------------------------------------------------------------------
// Description:
// Parameters:
// Returns: TRUE if successful.
//----------------------------------------------------------------------------
VOID FN_E Z4PofCopy(PZ4_PF_TBL ppof1, PZ4_PF_TBL ppof2, LONG lMax)
{
LONG l;
Assert(ppof1 && ppof2);
if (lMax < 0)
lMax = ppof2->lSize;
for (l = 0; l < MIN(lMax, ppof2->lSize); ++l)
{
CHAR szFinance[MAX_FINANCE+1];
strb2a(ppof2->abPof[(SIZET)l], MAX_FINANCE_BCD, szFinance, MAX_FINANCE, TRUE);
szFinance[MAX_FINANCE] = '\0';
Z4PofAdd(ppof1, szFinance);
}
return ;
}
//----------------------------------------------------------------------------
// Description:
// Parameters:
// Returns: TRUE if successful.
//----------------------------------------------------------------------------
BOOL FN_E Z4PofCreate(PZ4_PF_TBL _FAR_ *pppof, LONG lMax)
{
SIZET cb;
Assert(pppof);
#if OS_DOS
Assert(lMax * (LONG)MAX_FINANCE_BCD < (LONG)MAX_SIZET);
#endif
cb = sizeof(Z4_PF_TBL) + (SIZET)((lMax - 1) * MAX_FINANCE_BCD);
*pppof = MemAllocZero(cb);
if (*pppof == NULL)
return ErrorNoMem();
(*pppof)->lMax = lMax;
return TRUE;
}
//----------------------------------------------------------------------------
// Description:
// Parameters:
// Returns: TRUE if successful.
//----------------------------------------------------------------------------
VOID FN_E Z4PofDelete(PZ4_PF_TBL ppof, LONG lDelete)
{
SIZET cb;
Assert(ppof);
if (lDelete > ppof->lSize)
lDelete = ppof->lSize;
cb = (SIZET)((ppof->lSize - lDelete) * MAX_FINANCE_BCD);
if (cb)
memcpy(ppof->abPof[0], ppof->abPof[(SIZET)lDelete], cb);
ppof->lSize -= lDelete;
return ;
}
//----------------------------------------------------------------------------
// Description:
// Parameters:
// Returns: TRUE if successful.
//----------------------------------------------------------------------------
VOID FN_E Z4PofDestroy(PZ4_PF_TBL ppof)
{
if (ppof)
MemFree(ppof);
return ;
}
//----------------------------------------------------------------------------
// Description: Find a finance number in the POF table
// Parameters:
// Returns: Offset of entry or -1
//----------------------------------------------------------------------------
LONG FN_E Z4PofFind(PZ4_PF_TBL ppof, PCSZ pcszFinance)
{
BYTE bPof[MAX_FINANCE_BCD];
PBYTE pb;
Assert(ppof);
if (ppof->lSize == 0)
return -1L;
stra2b(bPof, MAX_FINANCE_BCD, pcszFinance, MAX_FINANCE);
pb = bsearch(bPof, ppof->abPof, (SIZET)ppof->lSize, MAX_FINANCE_BCD, __pofsort__);
if (pb == NULL)
return -1L;
return (LONG)((pb - (PBYTE)ppof->abPof) / MAX_FINANCE_BCD);
}
//----------------------------------------------------------------------------
// Description:
// Parameters:
// Returns: TRUE if successful.
//----------------------------------------------------------------------------
BOOL FN_E Z4PofRead(PZ4_PF_TBL ppof, PCSZ pcszFile)
{
CHAR szName[MAX_PATH];
FLAG16 fs = FL_OPEN|FL_READWRITE|FL_DENYREADWRITE|FL_BINARY;
HF hf;
LONG lSize;
SIZET cb;
Assert(ppof && pcszFile);
strcpy(szName, pcszFile);
Z4PofClear(ppof);
if (!FnameQualify(szName, NULL, EnvGet("DATA"), 0))
return FALSE;
if (!FnameIsFile(szName))
return TRUE;
if (!FileOpen(&hf, szName, fs, NULL))
return FALSE;
if (!FileRead(hf, &lSize, sizeof(lSize), 0L))
{
FileClose(hf);
return FALSE;
}
Assert(lSize >= 0);
Assert(lSize <= ppof->lMax);
cb = (SIZET)(lSize * MAX_FINANCE_BCD);
if (cb && !FileRead(hf, ppof->abPof, cb, -1L))
{
FileClose(hf);
return FALSE;
}
ppof->lSize = lSize;
FileClose(hf);
return TRUE;
}
//----------------------------------------------------------------------------
// Description:
// Parameters:
// Returns:
//----------------------------------------------------------------------------
VOID FN_E Z4PofShow(PZ4_PF_TBL ppof)
{
LONG i, j;
Assert(ppof);
Output("%ld Entries (%ld max)\n", ppof->lSize, ppof->lMax);
for (i = 0; i < ppof->lSize; )
{
Output("%5ld:", i);
for (j = 0; j < 10 && i < ppof->lSize; i++, j++)
{
CHAR szFinance[MAX_FINANCE+1];
strb2a(ppof->abPof[(SIZET)i], MAX_FINANCE_BCD, szFinance, MAX_FINANCE, TRUE);
szFinance[MAX_FINANCE] = '\0';
Output(" %6s", szFinance);
}
Output("\n");
}
Output("\n");
return ;
}
//----------------------------------------------------------------------------
// Description:
// Parameters:
// Returns: TRUE if successful.
//----------------------------------------------------------------------------
BOOL FN_E Z4PofWrite(PZ4_PF_TBL ppof, PCSZ pcszFile)
{
CHAR szName[MAX_PATH];
FLAG16 fs = FL_CREATE|FL_TRUNCATE|FL_READWRITE|FL_DENYREADWRITE|FL_BINARY;
HF hf;
SIZET cb;
Assert(ppof && pcszFile);
strcpy(szName, pcszFile);
if (!FnameQualify(szName, NULL, EnvGet("DATA"), 0))
return FALSE;
if (!FileOpen(&hf, szName, fs, NULL))
return FALSE;
cb = (SIZET)(ppof->lSize * MAX_FINANCE_BCD);
if (!FileWrite(hf, &ppof->lSize, sizeof(ppof->lSize), 0L)
|| (cb && !FileWrite(hf, ppof->abPof, cb, -1L)))
{
FileClose(hf);
return FALSE;
}
FileClose(hf);
return TRUE;
}
//----------------------------------------------------------------------------
//------------------------------- End of File --------------------------------
//----------------------------------------------------------------------------